/**
 * 创建一个带有超时功能的fetch请求高阶函数
 * @param {number} timeout
 * @returns
 */
export function createFetchWithTimeout(timeout) {
  // 返回一个函数，该函数接受一个url和一个options参数
  return function (url, options) {
    // 返回一个Promise对象
    return new Promise((resolve, reject) => {
      // 创建一个AbortController对象
      const controller = new AbortController()
      // 如果options参数存在，则将其赋值给options变量
      options = options || {}
      // 如果options参数中存在signal属性，则添加一个事件监听器，当signal属性被触发时，调用controller.abort()方法
      if (options.signal) {
        options.signal.addEventListener('abort', () => {
          controller.abort()
        })
      }
      // 将controller.signal赋值给options.signal
      options.signal = controller.signal
      // 创建一个定时器，当定时器触发时，调用reject方法，并传入一个Error对象，同时调用controller.abort()方法
      const timer = setTimeout(() => {
        reject(new Error('Request timeout'))
        controller.abort()
      }, timeout)
      // 调用fetch方法，传入url和options参数，当请求成功时，调用resolve方法，当请求失败时，调用reject方法
      fetch(url, options)
        .then(resolve, reject)
        // 当请求完成后，清除定时器
        .finally(() => {
          clearTimeout(timer)
        })
    })
  }
}

export const fetchTimeout = createFetchWithTimeout(5000)
